/**
 * @description 基础服务
*/

const URL = require('url')

class Service {
  /**
   * @function 动态生成数据
   * @return {Object}
   * */
  result (success, status, code, msg, url, data) {
    let options = {}
    if (success && typeof success === 'object') {
      options = success
    } else {
      options = {
        success, status, code, msg, url, data
      }
    }

    // 状态处理
    options.success = (String(options.success) === '1' || options.success === true) ? 1 : 0
    return {
      //操作状态，1为成功，0为失败
      success : options.success ? 1 : 0,
      // 状态码
      status : options.status || 200,
      //数据对象
      data : options.hasOwnProperty('data') ? options.data : {},
      //具体消息代码
      msg : options.msg || (options.success ? 'success' : 'error'),
      //具体消息字符编码
      code : options.code || '',
      //跳转地址
      url : options.url || ''
    }
  }

  /**
   * @function 解析get请求参数
   * @return {Promise}
   * */
  solveQuery (req) {
    return new Promise((resolve, reject) => {
      try {
        // get参数解析
        let params = URL.parse(req.url, true).query
        resolve({params})
      } catch (e) {
        reject(e)
      }
    })
  }

  /**
   * @function 转换为JSON
   * @return {Object}
   * */
  solveJSON (data) {
    let result = {}
    if (/^(\[|\{)[\S\s]*(\]|\})$/.test(data.trim())) {
      try {
        result = JSON.parse(data)
      } catch (e) {
        result = {}
      }
    }

    return result
  }

  /**
   * @function 解析json请求数据
   * @return {Promise}
   * */
  solveRequest (req, dataType) {
    let me = this
    // get请求
    if (/get/i.test(req.method)) {
      return this.solveQuery(req)
    }

    return new Promise((resolve, reject) => {
      //创建空字符叠加数据片段
      var data = ''
      //2.注册data事件接收数据（每当收到一段表单提交的数据，该方法会执行一次）
      req.on('data', function (chunk) {
        // chunk 默认是一个二进制数据，和 data 拼接会自动 toString
        data += chunk
      })

      // 3.当接收表单提交的数据完毕之后，就可以进一步处理了
      //注册end事件，所有数据接收完成会执行一次该方法
      req.on('end', function () {
        //（1）.对url进行解码（url会对中文进行编码）
        data = data.replace(/%/g, '%25')
        data = decodeURIComponent(data)
        /**post请求参数不能使用url模块解析，因为他不是一个url，而是一个请求体对象 */

        //（2）.使用querystring对url进行反序列化（解析url将&和=拆分成键值对），得到一个对象
        //querystring是nodejs内置的一个专用于处理url的模块，API只有四个，详情见nodejs官方文档
        // var dataObject = querystring.parse(data)
        let params = data
        // json转换
        if (['binary'].indexOf(dataType) === -1) {
          params = me.solveJSON(data)
        }
        // GET参数
        let query = {}
        try {
          // get参数解析
          query = URL.parse(req.url, true).query
        } catch (e) {
          query = {}
        }
        // 执行回调
        resolve({params, query})
      })

      // 错误
      req.on('error', function (e) {
        reject(e)
      })
    })
  }
}

module.exports = Service